package daos;

import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Calendar;

import varios.Jugador;

import com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException;

import excepciones.AliasExistenteException;
import excepciones.ErrorDeRegistroException;
import excepciones.UsuarioOPasswordInvalidosException;

public class JugadorDAO {
	public void registrarJugador(Jugador jugador) {
		Connection conn = null;
		DBConnector dbc = new DBConnector();
		try {
			conn = dbc.getConnection();
			PreparedStatement statement = conn
					.prepareStatement("INSERT INTO jugadores (nombre,apellido,alias,password,email,fechaAlta,fechaModificacion) VALUES (?,?,?,?,?,?,?)");

			statement.setString(1, jugador.getNombre());
			statement.setString(2, jugador.getApellido());
			statement.setString(3, jugador.getAlias());
			statement.setString(4, jugador.getPassword());
			statement.setString(5, jugador.getEmail());
			statement.setDate(6, new Date(jugador.getFechaAlta().getTime()
					.getTime()));
			statement.setDate(7, new Date(jugador.getFechaModificacion()
					.getTime().getTime()));

			statement.executeUpdate();
			
		} catch (MySQLIntegrityConstraintViolationException a) {
			throw new AliasExistenteException();
		} catch (SQLException e){
			throw new ErrorDeRegistroException(e);
		} finally {
			dbc.cerrarConeccion(conn);
		}

	}

	public Jugador obtenerJugador(String alias, String password) {
		Connection conn = null;
		Jugador jugador;
		DBConnector dbc = new DBConnector();
		try {
			conn = dbc.getConnection();
			PreparedStatement statement = conn
					.prepareStatement("SELECT * FROM jugadores WHERE alias = ? && password = ?");
			statement.setString(1, alias);
			statement.setString(2, password);
				
			ResultSet rs = statement.executeQuery();
			
			Calendar fechaAlta = Calendar.getInstance();
			Calendar fechaModificacion = Calendar.getInstance();
			
			//Verifica la existencia del usuario en la DB
			if (!rs.first()) {
				throw new UsuarioOPasswordInvalidosException();
			}
			
			fechaAlta.setTime(rs.getDate("fechaAlta"));
			fechaModificacion.setTime(rs.getDate("fechaModificacion"));
			jugador = new Jugador(rs.getString("nombre"),
					rs.getString("apellido"), rs.getString("alias"),
					rs.getString("password"), rs.getString("email"), fechaAlta,
					fechaModificacion);
		} catch (SQLException e) {
			throw new ErrorDeRegistroException( );
		} finally {
			dbc.cerrarConeccion(conn);
		}
		return jugador;
	}

	public void cambiarPassword(String alias, String viejaPassword,
			String nuevaPassword) {
		Connection conn = null;
		DBConnector dbc = new DBConnector();
		try {
			conn = dbc.getConnection();
			PreparedStatement statement = conn
					.prepareStatement("UPDATE jugadores SET password = ?, fechaModificacion = ? WHERE alias = ? && password = ?");
			statement.setString(1, nuevaPassword);
			statement.setDate(2, new Date(Calendar.getInstance().getTime().getTime()));
			statement.setString(3, alias);
			statement.setString(4, viejaPassword);

			if(statement.executeUpdate() == 0){
				throw new UsuarioOPasswordInvalidosException();
			}
			
		} catch (SQLException e) {
			throw new ErrorDeRegistroException();
		} finally {
			dbc.cerrarConeccion(conn);
		}

	}
}
